package Entities;

import java.util.Enumeration;
import java.util.Vector;

public class Customer {

    private String _name;
    private Vector<Rental> _rentals = new Vector<Rental>();

    public Customer(String name) {
        this._name = name;
    }

    public void addRental(Rental rental) {
        _rentals.addElement(rental);
    }

    public String getName() {
        return _name;
    }

    /**
     * Логика расчёта следующая:
     * <ul>
     * <li>Обычные фильмы стоят $2 за два дня (минимальный срок аренды)</li>
     * <li>Детские - $1.5 за три дня (минимальный срок)</li>
     * <li>Новинки - $3 за день</li>
     * </ul>
     * <p>Если обычные берутся на срок больше двух дней - цена снижается до $1.5 за добавочные дни</p>
     * <p>За каждый фильм начисляется бонусное очко.</p>
     * <p>Если человек берет навинку больше чем на день - ему начисляется дополнительное бонусное очко.</p>
     *
     * @return Текст с расчетом
     */
    public String statement() {
        Enumeration<Rental> rentals = _rentals.elements();
        String result = String.format("Учет аренды для %s\n", getName());

        while (rentals.hasMoreElements()) {
            Rental each = rentals.nextElement();

            // Показать результаты для этой аренды
            result += String.format(
                    "\t%s\t%s\n",
                    each.getMovie().getTitle(),
                    String.valueOf(each.getCharge())
            );
        }

        // Добавить нижний колонтитул
        result += String.format(
                "Сумма задолженности составляет %s\n" +
                        "Вы заработали %d очков за активность\n",
                String.valueOf(getTotalCharge()),
                getTotalFrequentRenterPoints()
        );

        return result;
    }

    /**
     * @see Customer statement()
     * @return
     */
    public String htmlStatement() {
        Enumeration<Rental> rentals = _rentals.elements();
        String result = String.format("<h1>Учет аренды для <em>%s</em></h1>\n", getName());

        while (rentals.hasMoreElements()) {
            Rental each = rentals.nextElement();

            // Показать результаты для этой аренды
            result += String.format(
                    "<p><em>%s</em> %s</p>\n",
                    each.getMovie().getTitle(),
                    String.valueOf(each.getCharge())
            );
        }

        // Добавить нижний колонтитул
        result += String.format(
                "<hr><p>Сумма задолженности составляет <em>%s</em></p>\n" +
                        "<p>Вы заработали %d очков за активность</p>",
                String.valueOf(getTotalCharge()),
                getTotalFrequentRenterPoints()
        );

        return result;
    }

    private double getTotalCharge() {
        double totalAmount = 0;
        Enumeration<Rental> rentals = _rentals.elements();
        while (rentals.hasMoreElements()) {
            Rental each = rentals.nextElement();
            totalAmount += each.getCharge();
        }
        return totalAmount;
    }

    private int getTotalFrequentRenterPoints() {
        int frequentRenterPoints = 0;
        Enumeration<Rental> rentals = _rentals.elements();
        while (rentals.hasMoreElements()) {
            Rental each = rentals.nextElement();
            frequentRenterPoints += each.getFrequentRenterPoints();
        }
        return frequentRenterPoints;
    }
}
